<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>继承2</title>
</head>
<body>
    
</body>
<script>
    //定义一个动物类
    function Animal(name){
        //属性
        this.name=name||'Animal';
        //实例方法
        this.sleep=function(){
            console.log(this.name+"正在睡觉!");
        }
    }
    function Ufo(){
        this.lay=function(){
            console.log("反重力飞行");
        }
    }
    //原型方法
    Animal.prototype.eat=function(food){
        console.log(this.name+'正在吃:'+food);
    };
    //--------------上面是父类------------------
    // 原型链继承
    /*
    function Cat(){}
    Cat.prototype=new Animal('加菲猫');
    var cat=new Cat()
    cat.eat("🐟")
    cat.sleep()
    console.log(cat instanceof Animal);//true
    console.log(cat instanceof Cat);//true
    */
    //--------------上面是原型链方式(不支持多重继承)------------------
    /*
    function Cat(name){
        Animal.call(this);//调用父类的构造方法
        Ufo.call(this);//多重继承
        this.name=name||'小白';
    }
    var cat=new Cat('波斯猫')
    // cat.eat("🐟")
    cat.sleep()
    cat.lay()
    console.log(cat instanceof Animal);//false
    console.log(cat instanceof Ufo);//false
    console.log(cat instanceof Cat);//true
    */
    //--------------上面是构造函数方式(支持多重继承)------------------
    /*
    function Cat(name){
        var obj=new Animal();
        obj.name=name||"阿里巴巴";
        return obj;
    }
    var cat=new Cat();
    cat.eat("🐟");
    cat.sleep();
    console.log(cat instanceof Animal);//true
    console.log(cat instanceof Cat);//false
    */
    //--------------上面是实例继承------------------

    //拷贝继承在JSOOP继承.html
    /*
    function Cat(name){
        Animal.call(this);
        this.name=name||'组合';
    }
    Cat.prototype=new Animal();
    var cat=new Cat("小白");
    cat.sleep();
    cat.eat("饭");
    console.log(cat instanceof Animal);//true
    console.log(cat instanceof Cat);//true
    */
    //--------------上面是组合继承(原型链+构造函数方式[推荐])------------------

    function Cat(name){
        Animal.call(this);
        this.name=name||'终极组合';
    }
    (function(){
        var Super=function(){};
        Super.prototype=Animal.prototype;
        Cat.prototype=new Super();
    })();
  
    var cat=new Cat("小红");
    cat.sleep();
    cat.eat("喝粥");
    console.log(cat instanceof Animal);//true
    console.log(cat instanceof Cat);//true
    //--------------上面是寄生继承(原型链+构造函数方式[超推荐解决了组合继承的缺点])------------------
</script>
</html>